from machine import Pin, SoftSPI
import time
from tft import st7789py as st
from tft import tft_config


class DisplayManager:

    def __init__(self, tft):
        """
        初始化 DisplayManager 类。
        """
        self.tft = tft
        self.last_time = ""

    def show_text(self):
        """
        在显示屏上显示静态文本。
        """
        self.tft.text(24, '登高', 100, 0, st.BLUE, st.BLACK)
        self.tft.text(16, '杜甫', 110, 30, st.YELLOW, st.BLACK)
        
        #16号字库有问题没有句号。
        self.tft.text(16, '风急天高猿啸哀，渚清沙白鸟飞回。', 0, 70, st.WHITE, st.BLACK)
        self.tft.text(16, '无边落木萧萧下，不尽长江滚滚来。', 0, 90, st.WHITE, st.BLACK)
        self.tft.text(16, '万里悲秋常作客，百年多病独登台。', 0, 110, st.WHITE, st.BLACK)
        self.tft.text(16, '艰难苦恨繁霜鬓，潦倒新停浊酒杯。', 0, 130, st.WHITE, st.BLACK)
        self.tft.text(24, '相看两不厌，只有敬亭山。', 0, 160, st.RED, st.BLACK)
        self.tft.text(24, '众鸟高飞尽，孤云独去闲。', 0, 200, st.GREEN, st.BLACK)

    def show_time(self, t):
        """
        更新屏幕上的时间显示。

        Args:
            t (tuple): 当前时间的元组，格式为 (year, month, day, hour, minute, second, weekday, yearday)。
        """
        if not isinstance(t, tuple) or len(t) != 8:
            raise ValueError("Invalid time tuple format")

        hour, minute, second = t[3], t[4], t[5]
        time_str = f"{hour:02}:{minute:02}:{second:02}"

        # 如果时间未发生变化，则不刷新
        if time_str != self.last_time:
            # 清空时间区域
            #self.tft.fill_rect(20, 240, 320, 32, st.BLACK)
            self.tft.text(16, time_str, 150, 30, st.RED, st.BLACK)  # 显示时间
            self.last_time = time_str

    def run(self):
        """
        主循环，显示静态文本并更新时间。
        """
        try:
            self.show_text()
            #这个UI阻塞程序的运行，解决方案，请参考气象时钟的实现。
            while True:
                t = time.localtime(time.time())
                print(t)
                self.show_time(t)
                time.sleep(1)  # 更长的时间间隔以减少 CPU 占用
        except Exception as e:
            print(f"An error occurred: {e}")

    def close(self):
        """
        反初始化 SPI。
        """
        self.tft.spi.deinit()


if __name__ == "__main__":
    tft = tft_config.config(1)
    dm = DisplayManager(tft)
    try:
        dm.run()
    finally:
        dm.close()  # 确保资源正确释放
